测量 Kanzi Engine 的性能

使用 Profiling build 测量 Kanzi Engine 不同部分的性能。此构建包括 已剖析的 Kanzi 库。

Profiling build 中的性能剖析类别

Profiling build 带有性能剖析类别和剖析程序,您可以用于测量 Kanzi Engine 不同部分的性能:

启动性能剖析类别

启动性能剖析程序测量应用程序启动期间 Kanzi Engine 花费在不同任务的时间。启动性能剖析程序在 StartupProfilerRegistry 中注册。默认情况下,所有启动性能剖析类别已启用。要在应用程序配置中设置类别状态,使用 配置名称。请参阅ProfilingCategoryFilter

此表列出了 Kanzi 启动性能剖析类别和 Profiling build 中包含的剖析程序。

类别 (Category)配置名称剖析程序
应用程序初始化StartupInitializationm_initializationProfiler
默认资源注册StartupRegisterDefaultResourcesm_registerDefaultResourcesProfiler
图像初始化StartupInitializeGraphicsm_initializeGraphicsProfiler
GL 子系统初始化StartupInitializeGLm_initializeGLProfiler
启动 kzb 文件打开StartupOpenKzbm_openKzbProfiler
加载线程初始化StartupInitializeLoadingThreadsm_initializeLoadingThreadsProfiler
元数据注册StartupRegisterMetadatam_registerMetadataProfiler
插件加载StartupLoadPluginsm_loadPluginsProfiler
预设件加载StartupLoadPrefabm_loadPrefabProfiler
预设件安装StartupInstantiatePrefabm_instantiatePrefabProfiler
预设件附加StartupAttachPrefabm_attachPrefabProfiler
渲染器重置StartupResetRendererm_resetRendererProfiler
运行时资产注册StartupRegisterRuntimeAssetsm_registerRuntimeAssetsProfiler
   

主循环任务性能剖析类别

主循环任务性能剖析程序测量 Kanzi EngineKanzi 主循环每次迭代的不同任务花费的时间。主循环任务性能剖析程序在 MainLoopTaskProfilerRegistry 中注册。默认情况下,所有主循环任务性能剖析类别已启用。要在应用程序配置中设置类别状态,使用 配置名称。请参阅ProfilingCategoryFilter

此表列出了 Kanzi 主循环任务性能剖析类别和 Profiling build 中包含的剖析程序。

类别 (Category)配置名称HUD 中的标题剖析程序
动画 (Animations)
测量渲染动画的时间。
MainLoopAnimation主循环:动画m_animationProfiler
应用程序事件处理
测量收集和处理所有可用事件源的事件所花费的事件,如键盘、鼠标和其他可用操纵器。
MainLoopApplicationEvents主循环:应用程序事件m_applicationEventsProfiler
应用程序逻辑更新
测量花费在您提供的 Application::update 重写上的时间。
MainLoopAppUpdate主循环:应用程序更新m_appUpdateProfiler
用户提供的应用程序逻辑更新
测量花费在执行您提供的更新逻辑回调 Application::onUpdate 上的时间。
MainLoopUserUpdate主循环:用户更新m_userUpdateProfiler
图形事件处理
测量处理影响图形输出的事件花费的时间,如重设窗口大小。
MainLoopGraphicsEvents主循环:图形事件m_graphicsEventsProfiler
性能 HUD (Performance HUD)
测量渲染 性能 HUD (Performance HUD) 中的信息导致的开销。
MainLoopHUD主循环:HUDm_hudProfiler
输入事件处理
测量 InputManager 处理输入事件花费的时间,如键盘和鼠标事件。
MainLoopInput主循环:输入m_inputProfiler
布局
测量布局通道的性能。
MainLoopLayout主循环:布局m_layoutProfiler
渲染 (Rendering)
测量在 Application::renderOverride 中渲染屏幕所花费的时间。
MainLoopRendering主循环:渲染m_renderingProfiler
资源部署
测量处理异步任务部署队列花费的时间。
MainLoopResourceDeployment主循环:资源部署m_resourceDeploymentProfiler
资源管理器更新
测量 ResourceManager 处理负载和部署队列花费的时间。
MainLoopResourceManagerUpdate主循环:资源管理器更新m_resourceManagerUpdateProfiler
任务调度程序
测量执行添加到任务调度器中的任务花费的时间。
MainLoopTaskDispatcher主循环:任务调度程序m_taskDispatcherProfiler
任务调度器
测量执行添加到任务调度器中的定期任务花费的时间,如动画。
MainLoopTaskScheduler主循环:任务调度器m_taskSchedulerProfiler

性能 HUD (Performance HUD) 中,您可以显示所有主循环任务性能剖析程序的性能测量图表。请参阅在 性能 HUD (Performance HUD) 中显示性能测量图

在应用程序配置中,您可以设置主循环性能剖析程序中采样缓冲区的大小。请参阅 主循环剖析样本缓冲区计数

性能 HUD (Performance HUD) 中显示性能测量图

对于在主循环任务剖析程序注册表 MainLoopTaskProfilerRegistry 中注册的性能剖析类别的性能剖析程序,您可以显示其性能剖析图。要访问主循环任务剖析程序注册表,使用 Domain::getMainLoopTaskProfilerRegistry

本节介绍了如何显示 Profiling build 中包含的主循环任务剖析程序的性能测量图。请参阅主循环任务性能剖析类别

您还可以显示创建用于测量应用程序代码性能的主循环任务剖析程序的性能测量图。请参阅测量自定义主循环任务的性能

要在 性能 HUD (Performance HUD) 中显示性能测量图:

  1. 显示完整的 性能 HUD (Performance HUD)请参阅配置应用程序PerformanceInfoLevel
  2. 在应用程序配置中,启用显示您想在 性能 HUD (Performance HUD) 中看到的性能图。请参阅主循环任务性能剖析类别ProfilingCategoryFilter
    例如,要显示 Main loop: animationMain loop: renderingMain loop:性能 HUD (Performance HUD) 中的 HUD 图:
  3. (可选)设置 Kanzi 用于绘制性能 HUD (Performance HUD) 的颜色:
    1. 在 Visual Studio 中,在您要设置颜色的文件中,包含 performance_info.hpp 头文件。
      例如,要设置 Kanzi 用于绘制滚动视图示例性能 HUD (Performance HUD) 颜色,在 scroll_view.cpp 文件中添加:
      #include <kanzi/core.ui/application/performance_info.hpp>
    2. 设置 Kanzi 用于显示性能 HUD (Performance HUD) 图形框、图形数据和文本的颜色。
      例如,在 scroll_view.cpp 文件的 onProjectLoaded 函数中添加:
      //获取 performanceInfo 对象。如果对象不存在,请创建。
      PerformanceInfo& performanceInfo = acquirePerformanceInfo();
      //将图形框的颜色设置为灰色。
      performanceInfo.setBorderColor(ColorRGBA(0.5f, 0.5f, 0.5f));
      //将图形数据的颜色设置为黄色。
      performanceInfo.setLineColor(ColorRGBA(1.0f, 1.0f, 0.0f));
      //将文本的颜色设置为黑色。
      performanceInfo.setFontColor(ColorRGBA(0.0f, 0.0f, 0.0f));
  4. 构建和运行应用程序。 请参阅部署 Kanzi 应用程序
    要显示预定义主循环任务剖析程序的性能图,使用 Profiling build
    例如,在 Windows 中使用 GL_vs2015_Profiling 构建配置在 Visual Studio 中构建您的应用程序。

当您运行应用程序时,性能 HUD (Performance HUD) 显示性能测量图。
如果您看不到这些图,放大应用程序窗口。

记录 Kanzi Engine 性能剖析数据

要分析 Kanzi Engine 性能,记录性能剖析数据。

记录启动性能信息

您可以使用 Profiling build 中的 Kanzi 启动性能剖析程序测量应用程序启动期间 Kanzi Engine 花费在不同任务的时间。请参阅启动性能剖析类别

要记录启动性能信息,使用 Profiling build 配置构建您的应用程序。

例如,要在 Windows 上构建并运行您的应用程序:

  1. 在 Visual Studio 中使用 GL_vs2015_Profiling 构建配置构建您的应用程序。
  2. 打开您计算机上的命令行界面,然后运行应用程序,将应用程序输出导向要存储性能测量数据的文件。
    <MyProject>\Application\bin> ..\output\Win32\GL_vs2015_Profiling\MyApplication.exe > MyApplicationProfiling.log

Kanzi 将启动性能测量信息写入日志中。

...
info:profiling> StartupInitialization                        332 018 600 ns
info:profiling> |-- StartupInitializeGraphics                301 798 600 ns
info:profiling> |-- StartupCreateDomain                        1 325 300 ns
info:profiling> |-- StartupInitializeLoadingThreads           27 126 000 ns
info:profiling> |-- StartupRegisterRuntimeAssets                 132 400 ns
info:profiling> |-- StartupLoadPlugins                               200 ns
info:profiling> |-- StartupRegisterMetadata                      449 000 ns
info:profiling> |-- StartupOpenKzb                               398 000 ns
info:profiling> StartupInitializeGL                                  100 ns
info:profiling> StartupResumeGL                                  536 400 ns
info:profiling> StartupLoadPrefab                            388 009 100 ns
info:profiling> StartupInstantiatePrefab                      10 308 400 ns
info:profiling> StartupRegisterDefaultResources                   25 800 ns
info:profiling> StartupAttachPrefab                            8 058 300 ns
info:profiling> StartupResetRenderer                              74 200 ns
info:profiling> StartupOnProjectLoaded                            21 400 ns
info:profiling> Startup profiling data logging took   1 920 000 ns
...

记录来自剖析程序的数据

您可以记录来自特定剖析程序的数据:

记录来自剖析程序注册表的数据

您可以通过在剖析程序中迭代并调用 logAggregateData()logAllData() 函数来记录特定剖析程序注册表中注册的所有剖析程序的数据。

例如,要在退出应用程序时记录来自所有主循环任务剖析程序的性能剖析数据摘要:

    //Kanzi 在应用程序退出时调用函数。
    virtual void onShutdown() KZ_OVERRIDE
    {
        //获得主循环任务剖析程序注册表 MainLoopTaskProfilerRegistry。
        const MainLoopTaskProfilerRegistry& mainRegistry = getDomain()->getMainLoopTaskProfilerRegistry();

        //通过主循环任务剖析程序注册表中的所有剖析程序,并记录其总数据。
        for (MainLoopTaskProfilerRegistry::ProfilerContainer::const_iterator
            profilerIter = mainRegistry.beginProfilers(),
            profilerIterEnd = mainRegistry.endProfilers();
            profilerIter != profilerIterEnd; ++profilerIter)
        {
            (*profilerIter)->logAggregateData();
        }
    }

另请参阅

测量应用程序性能

测量应用程序代码的性能

配置应用程序